// 产品表单验证 Schema
// 支持需求 3.3 - 表单数据验证

import { PRODUCT_TYPES } from '../types/product'

/**
 * 产品表单字段配置
 */
export const PRODUCT_FORM_FIELDS = {
    title: {
        label: '产品标题',
        placeholder: '请输入产品标题',
        maxLength: 255,
        required: true
    },
    description: {
        label: '产品描述',
        placeholder: '请输入产品描述',
        maxLength: 2000,
        required: true
    },
    type: {
        label: '产品类型',
        required: true,
        options: [
            { value: PRODUCT_TYPES.WEBSITE, label: '网站' },
            { value: PRODUCT_TYPES.APP, label: '应用程序' }
        ]
    },
    url: {
        label: '网站链接',
        placeholder: 'https://example.com',
        required: true, // 当 type 为 website 时
        pattern: /^https?:\/\/.+/
    },
    file: {
        label: '应用文件',
        required: true, // 当 type 为 app 时
        accept: '.exe,.zip,.rar,.7z',
        maxSize: 100 * 1024 * 1024 // 100MB
    },
    thumbnail: {
        label: '产品缩略图',
        required: false,
        accept: '.jpg,.jpeg,.png,.gif,.webp',
        maxSize: 5 * 1024 * 1024 // 5MB
    }
}

/**
 * 验证产品标题
 * @param {string} title - 产品标题
 * @returns {string|null} 错误信息或 null
 */
export function validateTitle(title) {
    const config = PRODUCT_FORM_FIELDS.title

    if (!title || title.trim().length === 0) {
        return `${config.label}不能为空`
    }

    if (title.length > config.maxLength) {
        return `${config.label}不能超过 ${config.maxLength} 个字符`
    }

    return null
}

/**
 * 验证产品描述
 * @param {string} description - 产品描述
 * @returns {string|null} 错误信息或 null
 */
export function validateDescription(description) {
    const config = PRODUCT_FORM_FIELDS.description

    if (!description || description.trim().length === 0) {
        return `${config.label}不能为空`
    }

    if (description.length > config.maxLength) {
        return `${config.label}不能超过 ${config.maxLength} 个字符`
    }

    return null
}

/**
 * 验证产品类型
 * @param {string} type - 产品类型
 * @returns {string|null} 错误信息或 null
 */
export function validateProductType(type) {
    if (!type || !Object.values(PRODUCT_TYPES).includes(type)) {
        return '请选择有效的产品类型'
    }

    return null
}

/**
 * 验证网站 URL
 * @param {string} url - 网站 URL
 * @param {boolean} required - 是否必需
 * @returns {string|null} 错误信息或 null
 */
export function validateUrl(url, required = true) {
    const config = PRODUCT_FORM_FIELDS.url

    if (required && (!url || url.trim().length === 0)) {
        return `${config.label}不能为空`
    }

    if (url && !config.pattern.test(url)) {
        return '请输入有效的网站链接（以 http:// 或 https:// 开头）'
    }

    return null
}

/**
 * 验证上传文件
 * @param {File} file - 上传的文件
 * @param {string} fieldName - 字段名称 ('file' | 'thumbnail')
 * @param {boolean} required - 是否必需
 * @returns {string|null} 错误信息或 null
 */
export function validateFile(file, fieldName = 'file', required = true) {
    const config = PRODUCT_FORM_FIELDS[fieldName]

    if (required && !file) {
        return `${config.label}不能为空`
    }

    if (!file) {
        return null // 非必需且未上传
    }

    // 检查文件大小
    if (file.size > config.maxSize) {
        const maxSizeMB = config.maxSize / (1024 * 1024)
        return `${config.label}大小不能超过 ${maxSizeMB}MB`
    }

    // 检查文件类型
    const allowedExtensions = config.accept.split(',').map(ext => ext.trim().toLowerCase())
    const fileExtension = '.' + file.name.split('.').pop().toLowerCase()

    if (!allowedExtensions.includes(fileExtension)) {
        return `${config.label}格式不支持，请选择 ${config.accept} 格式的文件`
    }

    return null
}

/**
 * 完整的产品表单验证
 * @param {Object} formData - 表单数据
 * @returns {Object} 验证结果 { isValid, errors }
 */
export function validateProductForm(formData) {
    const errors = {}

    // 验证标题
    const titleError = validateTitle(formData.title)
    if (titleError) errors.title = titleError

    // 验证描述
    const descriptionError = validateDescription(formData.description)
    if (descriptionError) errors.description = descriptionError

    // 验证产品类型
    const typeError = validateProductType(formData.type)
    if (typeError) errors.type = typeError

    // 根据产品类型验证相应字段
    if (formData.type === PRODUCT_TYPES.WEBSITE) {
        const urlError = validateUrl(formData.url, true)
        if (urlError) errors.url = urlError
    } else if (formData.type === PRODUCT_TYPES.APP) {
        const fileError = validateFile(formData.file, 'file', true)
        if (fileError) errors.file = fileError
    }

    // 验证缩略图（可选）
    if (formData.thumbnail) {
        const thumbnailError = validateFile(formData.thumbnail, 'thumbnail', false)
        if (thumbnailError) errors.thumbnail = thumbnailError
    }

    return {
        isValid: Object.keys(errors).length === 0,
        errors
    }
}

/**
 * 获取字段的 Ant Design 表单规则
 * @param {string} fieldName - 字段名称
 * @param {Object} formData - 当前表单数据（用于条件验证）
 * @returns {Array} Ant Design 表单规则数组
 */
export function getFieldRules(fieldName, formData = {}) {
    const rules = []

    switch (fieldName) {
        case 'title':
            rules.push(
                { required: true, message: '请输入产品标题' },
                { max: 255, message: '产品标题不能超过 255 个字符' }
            )
            break

        case 'description':
            rules.push(
                { required: true, message: '请输入产品描述' },
                { max: 2000, message: '产品描述不能超过 2000 个字符' }
            )
            break

        case 'type':
            rules.push(
                { required: true, message: '请选择产品类型' }
            )
            break

        case 'url':
            if (formData.type === PRODUCT_TYPES.WEBSITE) {
                rules.push(
                    { required: true, message: '请输入网站链接' },
                    { pattern: /^https?:\/\/.+/, message: '请输入有效的网站链接' }
                )
            }
            break

        case 'file':
            if (formData.type === PRODUCT_TYPES.APP) {
                rules.push(
                    { required: true, message: '请选择要上传的应用文件' }
                )
            }
            break
    }

    return rules
}